#include <bits/types/sigset_t.h>
#include <csignal>
#include <iostream>
#include <sched.h>
#include <signal.h>
#include <unistd.h>
using namespace std;


// 父进程不处理子进程
int main() {
    signal(SIGCHLD, SIG_IGN); // 父进程不关心子进程
    for(int i = 0; i < 10; i++) {
        pid_t id = fork();
        if(id == 0) {
            sleep(3);
            cout << "I am child, exit" << endl;
            // if(i <= 6) {
            //     exit(1);
            // }else {
            //     pause();
            // }
            exit(1);
        }
    }
    while (1) {
        cout << "hhhhhhhhhh" << endl;
        sleep(1);
    }
    return 0;
}
// int flag = 0;
// void handler(int sig) {
//     cout << "更改了全局变量，" << flag << " -> " << "1" << endl;
//     flag = 1;
// }
// int main() {
//     signal(2, handler);
//     while(!flag);
//     cout << "process quit normal" << endl;
//     return 0;
// }
// void handler(int sig) {
//     cout << "mysig: " << sig << endl;
//     while(true) {
//         // 获取未决表
//         sigset_t pending;
//         sigpending(&pending);
//         for(int i = 31; i >= 1; i--) {
//             if(sigismember(&pending, i)) { // 这里一开始2号是直接递达了的，但是为了防止信号的重入所以我们这里将2号信号也加入了屏蔽（内核执行的），之后再传入的时候就会未决了
//                 cout << "1";
//             }else {
//                 cout << "0";
//             }
//         }
//         cout << endl;
//         sleep(1);
//     }
//     exit(0);
// }
// int main() {
//     struct sigaction act, oldact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     act.sa_flags = 0;
//     sigaction(SIGINT, &act, &oldact); // 执行2号信号的时候，三号四号自动屏蔽了，
//     while(true) {
//         cout << "hello world" << ": pid: " << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }